Androidアプリケーションからlogcatコマンドを実行する

Last-modified: 2013-07-02 (火) 21:03:42

Androidのログを閲覧するlogcatコマンドをアプリケーションから実行する方法を紹介します。

 

logcatコマンド

 

logcatコマンドのオプションを紹介します。

 
  • オプション
    オプション説明
    -sデフォルトのフィルターをsilentに設定します(フィルターに「*:s」と指定するのと同様)
    -f ≪ファイル名≫ログをファイルに出力します
    -cログをクリアします
    -dログをダンプし、終了します
    -gログのサイズを取得し、終了します
    -v ≪フォーマット≫ログのプリントフォーマットを設定します(フォーマットは下表参照)
     
    -v フォーマット
    briefW/tag ( 876): message
    processW( 876) message (tag)
    tagW/tag : message
    threadW( 876:0x37c) message
    rawmessage
    time09-08 05:40:26.729 W/tag ( 876): message
    threadtime09-08 05:40:26.729 876 892 W tag : message
    long[ 09-08 05:40:26.729 876:0x37c W/tag ] message
 
  • フィルター
    「≪タグ≫:≪プライオリティ≫」で指定します。
    タグは完全一致、プライオリティは指定値以上のものを表示します。
    タグを指定してもなぜかフィルターが機能しません。
    「-s ≪タグ≫:*」のように、-sを付与すると機能します。
     
     

Androidアプリケーションでのlogcatコマンド実行

 

アプリケーションからlogcatコマンドを実行するサンプルです。

 

サンプルのソースコード
fileLogSampleActivity.java

 
  • AndroidManifest.xmlにログ読み取りのパーミッションを追加
    <uses-permission android:name="android.permission.READ_LOGS" />
 
  • logcatコマンドの実行
     
    • ログのクリア
             try {
                 Runtime.getRuntime().exec("logcat -c");
             } catch(Exception e) {
                 // 例外処理
             }
       
    • ログの取得
             try {
                 ArrayList<String> commandLine = new ArrayList<String>();
                 // コマンドの作成
                 commandLine.add( "logcat");
                 commandLine.add( "-d");
                 commandLine.add( "-v");
                 commandLine.add( "time");
                 commandLine.add( "-s");
                 commandLine.add( "tag:W");
                 Process process = Runtime.getRuntime().exec( commandLine.toArray( new String[commandLine.size()]));
                 BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(process.getInputStream()), 1024);
                 String line;
                 while ((line = bufferedReader.readLine()) != null) {
                     log.append(line);
                     log.append("\n");
                 }
             } catch ( IOException e) {
                 // 例外処理
             }
 
  • 取得例
    09-08 09:44:42.267 W/tag     (  754): message1
    09-08 09:44:42.709 W/tag     (  754): message2
    09-08 09:44:43.187 W/tag     (  754): message3
    09-08 09:44:45.295 E/tag     (  754): message8
 
 

logcatコマンドを利用したログ監視

 

ログをリアルタイムで監視するサンプルです。

 

サンプルのソースコード
fileLogMonitorSampleActivity.java

 
  • ログを書き続けるスレッド
       private class LogThread extends Thread{
           private int cnt = 1;
           @Override
           public void run() {
                while( true){
                    Log.w( "tag", "message" + cnt++);
                }
           }
       }
 
  • ログの監視(コマンドから-dオプションを外す)
           try {
               ArrayList<String> commandLine = new ArrayList<String>();
               // コマンドの作成
               commandLine.add( "logcat");
               commandLine.add( "-v");
               commandLine.add( "time");
               commandLine.add( "-s");
               commandLine.add( "tag:W");
               Process process = Runtime.getRuntime().exec( commandLine.toArray( new String[commandLine.size()]));
               BufferedReader bufferedReader = new BufferedReader( new InputStreamReader( process.getInputStream()), 1024);
               String line;
               while ((line = bufferedReader.readLine()) != null) {
                   Log.i("LogMonitor", line);
               }
           } catch ( IOException e) {
               // 例外処理
           }

  • 無限ループに陥らないように修正しておきました。 by haseguru https://twitter.com/#!/haseguru -- 2012-05-24 (木) 01:05:33
  • 参考になりました!whileでlineを進めてあげないと無限ループに陥ります。 -- 2010-05-28 (金) 00:31:49